/*
题目: 二维网络迁移
给你一个 m 行 n 列的二维网格 grid 和一个整数 k。你需要将 grid 迁移 k 次。

每次「迁移」操作将会引发下述活动：

    位于 grid[i][j] 的元素将会移动到 grid[i][j + 1]。
    位于 grid[i][n - 1] 的元素将会移动到 grid[i + 1][0]。
    位于 grid[m - 1][n - 1] 的元素将会移动到 grid[0][0]。

请你返回 k 次迁移操作后最终得到的 二维网格。
 */
import java.util.ArrayList;
import java.util.List;

public class ShiftGrid {
    public List<List<Integer>> shiftGrid(int[][] grid, int k) {
        //元素向右移动一格,列的最后一个元素跑到下一列第一格,最后一个元素跑到第一格位置
        List<List<Integer>> list = new ArrayList<>();
        int row = grid.length; //分别为行和列
        int col = grid[0].length;
        int sum = row * col;
        k = k <= sum ? k : k % sum;
        int curRow = (sum - k) / col; //定位刚开始的位置
        if (sum == 1) curRow = 0;
        int curCol = (sum - k) % col;
        for (int i = 0; i < row; i++) {
            List<Integer> cur = new ArrayList<>();
            for (int j = 0; j < col; j++) {
                cur.add(grid[curRow][curCol]);
                curRow = curCol == col - 1 ? (curRow + 1) % row : curRow;
                curCol = (curCol + 1) % col;
            }
            list.add(cur);
        }
        return list;
    }
}
